import { Injectable } from "@nestjs/common";
import { PassportStrategy } from "@nestjs/passport";
import { ExtractJwt, Strategy } from "passport-jwt";
import { jwtConstants } from "src/modules/auth/constants";
import { JwtPayload } from "../interfaces/jwt.interface";

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      // 告知如何获取 token ，此处是从 Header Auth 中获取以 Bearer 为首的 Token。
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      // 是否 不判断 expire ，那肯定是要判断的，所以为 false
      ignoreExpiration: false,
      // 秘钥
      secretOrKey: jwtConstants.secret,
    });
  }

  // 由于这是非 local 方案，不需要提供自己的鉴权实现，只用获取 jwt 鉴权之后返回的 payload 即可。
  // 此处将它封装成了一个id和username组成的对象
  async validate(payload: JwtPayload): Promise<JwtPayload> {
    return payload;
  }
}
